package ar.com.bdf.ipharma.protocolo.model;

import java.util.regex.Pattern;

import ar.com.bdf.ipharma.protocolo.model.utils.ConverterUtil;

public class Trama {

	private DataTrama dataTrama;
	private Comando comando;
	private String datos;

	public Trama(DataTrama dataTrama, Comando comando, String datos) {
		super();
		this.dataTrama = dataTrama;
		this.comando = comando;
		this.datos = datos;
	}

	public Integer getIdentificador() {
		return dataTrama.getIdentificador();
	}

	public void setIdentificador(Integer identificador) {
		this.dataTrama.setIdentificador(identificador);
	}

	public Comando getComando() {
		return comando;
	}

	public void setComando(Comando comando) {
		this.comando = comando;
	}

	public String getDatos() {
		return datos;
	}

	public void setDatos(String datos) {
		this.datos = datos;
	}

	public String getCheckSum() {
		Integer longitud = this.getLongitud() / 2;
		Integer comando = Integer.parseInt(this.comando.toString(), 16);
		Integer identificador = dataTrama.getIdentificador() != null ? dataTrama.getIdentificador() : 0 ;
		Integer sumatoria = longitud + identificador + comando + datos.length();

		String complementoUno = ConverterUtil.convertToHexa(~sumatoria);
		complementoUno = complementoUno.substring(Math.max(0, complementoUno.length() - 2));

		return complementoUno;
	}

	public Integer getLongitud() {
		Integer longIdentificador = dataTrama.getIdentificador() != null ? 2 : 0;
		return longIdentificador + 2 + datos.length() + 2;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((comando == null) ? 0 : comando.hashCode());
		result = prime * result	+ ((dataTrama == null) ? 0 : dataTrama.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Trama other = (Trama) obj;
		if (comando == null) {
			if (other.comando != null)
				return false;
		} else if (!comando.equals(other.comando))
			return false;
		if (dataTrama == null) {
			if (other.dataTrama != null)
				return false;
		} else if (!dataTrama.equals(other.dataTrama))
			return false;
		if (datos == null) {
			if (other.datos != null)
				return false;
		} else if (!datos.equals(other.datos)){
			return Pattern.matches(datos, other.datos);			
		}
		return true;
	}

}
